#ifndef PROTOCOLSTRUCTURES_H
#define PROTOCOLSTRUCTURES_H

#include <QtGlobal>
#include <QMetaType> // 注册自定义类型以便在信号槽中使用

// 定义功能码
enum FunctionCode : quint8
{
    FuncCode_Heartbeat = 0x01,      // 从机心跳指令
    FuncCode_DeviceInfoRequest = 0x02, // 设备信息请求指令
    FuncCode_DeviceInfoResponse = 0x03, // 设备信息响应指令
    FuncCode_ControlCommand = 0x04,   // 控制指令
    FuncCode_DataUpload = 0x05,     // 数据上传指令
    // ... 可以根据需要添加更多功能码
    FuncCode_Max = 0xFF // 最大功能码，用于边界检查
};

// 定义从机心跳包结构体
// 注意：Qt的QDataStream默认按大端序（BigEndian）读写基本类型，
//      结构体成员的字节序需要手动或通过预编译指令确保一致性
//      在网络通信中，通常采用大端序。
//      如果涉及多字节成员（如quint16, quint32），需要注意其在内存中的存储顺序
//      和网络传输的顺序。这里我们假设直接传输，QDataStream会处理好基本类型的字节序。

#pragma pack(push, 4) // 确保结构体成员紧凑排列，无填充字节

// 心跳指令结构体
struct HeartbeatPacket {
    quint8  deviceType;     // 设备类型
    quint16 deviceID;       // 设备ID
    quint8  status;         // 设备状态 (例如：0-正常, 1-故障)
    quint32 uptimeSec;      // 设备运行时间 (秒)
    // 更多心跳相关数据...
};

// 设备信息请求结构体 (如果需要，请求通常比较简单，可能只包含设备ID或为空)
struct DeviceInfoRequestPacket {
    quint16 deviceID; // 请求特定设备的ID，如果为0xFFFF表示请求所有
};

// 设备信息响应结构体
struct DeviceInfoResponsePacket {
    quint16 deviceID;        // 设备ID
    quint8  hardwareVersion; // 硬件版本
    quint8  firmwareVersion; // 固件版本
    char    deviceName[16];  // 设备名称，定长字符串
    // ... 更多设备信息
};

// 控制指令结构体
struct ControlCommandPacket {
    quint16 deviceID;       // 目标设备ID
    quint8  commandType;    // 控制命令类型 (例如：0x01-开关, 0x02-设置参数)
    quint8  commandValue;   // 命令值 (例如：0-关, 1-开; 参数值)
    // ... 更多控制参数
};

// 数据上传指令结构体 (示例，具体内容根据传感器或业务需求定义)
struct DataUploadPacket {
    quint16 deviceID;        // 源设备ID
    quint8  dataType;        // 数据类型 (例如：0x01-温度, 0x02-湿度)
    qint16  dataValue;       // 数据值 (例如：温度值，有符号)
    quint32 timestamp;       // 时间戳
    // ... 更多上传数据
};

#pragma pack(pop) // 恢复默认字节对齐

// 注册结构体类型，以便在信号槽中使用（如果需要直接传递结构体而非QByteArray）
// 注意：如果信号槽直接传递的是QByteArray，然后接收方自行解析，则无需注册
// 但为了演示，我们假设可能需要直接传递结构体副本
Q_DECLARE_METATYPE(HeartbeatPacket)
Q_DECLARE_METATYPE(DeviceInfoRequestPacket)
Q_DECLARE_METATYPE(DeviceInfoResponsePacket)
Q_DECLARE_METATYPE(ControlCommandPacket)
Q_DECLARE_METATYPE(DataUploadPacket)

#endif // PROTOCOLSTRUCTURES_H
